<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title></title>
	</head>
	<body>		
		<script>
		// call apply bind 区别
		// call与apply都是执行一个函数，第一个参数冒充this，bind 冒充this并产生一个新的函数
		// 实现这样的功能
		// 执行一个函数用myCall第一个参数冒充this（定义的是不定参数）
		Function.prototype.myCall = function(context,...args){			 
			var obj = context||window;
			var sy = Symbol("特殊符号唯一");//符号是唯一的，也可以用作对象的键名
			// obj.fn = this; //缓存this
			obj[sy] = this; //fun.myCall() this就是fun ，把fun挂载到obj
			// 执行this（执行函数）
			// obj.fn(...args);
			obj[sy](...args); //执行的时候是拓展  ，执行obj上的fun，fun执行时候里面this发送变化指向obj
			// delete obj.fn; //删除给obj新增的fn属性
			delete obj[sy];
			
		}
		
		function fun(a,b){
			console.log(this,a,b);
		}
		// 在Function原型挂载，所有函数都拥有myCall方法
		// fun.myCall({name:"mumu",age:18},5,3)
		
		// var f = fun.bind({name:"zql"});
		// f(3,4);
		
		Function.prototype.myBind = function(context,...args){
			// 获取到上下文，第一个参数
			context= context?context:window;
			// 定义一个符合
			var sy = Symbol();
			// 把this挂在context上下文
			context[sy] = this;
			 
			return function(){
				// args是myBind的参数，arguments是  return返回函数的参数列表
				var list = [...args,...arguments]
				// 返回函数，函数执行 执行context[sy]方法
				context[sy](...list);
				delete context[sy];
			}
		}
		
		var f = fun.myBind({name:"曾庆林"},4);
		f(6);
		
		</script>
	</body>
</html>
